package cn.hysh.appium.keyworddriver;

import cn.hysh.appium.base.ChPath;
import cn.hysh.appium.util.ProUtil;
import org.testng.Assert;
import org.testng.annotations.*;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

import java.lang.reflect.Method;


public class TestSuiteByExcel {
    public static Method method[];
    public static String keyword;
    public static String locatorExpression;
    public static String value;
    public static KeyWordsAction keyWordsaction;
    public static int testStep;
    public static int testLastStep;
    public static String testCaseID;
    public static String testCaseRunFlag;
    public static boolean testResult;

    @Test
    public void testTestSuite() throws Exception {

        keyWordsaction = new KeyWordsAction();
        // 使用 java 的反射机制获取 KeyWordsaction 类的所有方法对象
        method = keyWordsaction.getClass().getMethods();
        String excelFilePath = Constants.Path_ExcelFile;
        ExcelUtil.setExcelFile(excelFilePath);
        int testCasesCount = ExcelUtil.getRowCount(Constants.Sheet_TestSuite);
        for (int testCaseNo = 1; testCaseNo <= testCasesCount; testCaseNo++) {
            testCaseID = ExcelUtil.getCellData(Constants.Sheet_TestSuite,
                    testCaseNo, Constants.Col_TestCaseID);
            System.out.println(testCaseID);
            testCaseRunFlag = ExcelUtil.getCellData(Constants.Sheet_TestSuite,
                    testCaseNo, Constants.Col_RunFlag);
            if (testCaseRunFlag.equalsIgnoreCase("y")) {
                testResult = true;
                testStep = ExcelUtil.getFirstRowContainsTestCaseID(
                        Constants.Sheet_TestSteps, testCaseID,
                        Constants.Col_TestCaseID);
                testLastStep = ExcelUtil.getTestCaseLastStepRow(
                        Constants.Sheet_TestSteps, testCaseID, testStep);
                for (; testStep < testLastStep; testStep++) {
                    keyword = ExcelUtil.getCellData(Constants.Sheet_TestSteps,
                            testStep, Constants.Col_KeyWordAction);
                    System.out.println("从excel 文件读取到的关键字是：" + keyword);
                    locatorExpression = ExcelUtil.getCellData(Constants.Sheet_TestSteps, testStep, Constants.Col_LocatorExpression);
                    value = ExcelUtil.getCellData(Constants.Sheet_TestSteps,
                            testStep, Constants.Col_ActionValue);
                    System.out.println("从 excel 文件中读取的操作值是：" + value);
                    execute_Actions();
                    if (testResult == false) {
                        ExcelUtil.setCellData(Constants.Sheet_TestSuite, testCaseNo,
                                Constants.Col_TestSuiteTestResult, "测试执行失败");
                        // 调用测试方法过程中，若出现异常，则将测试设定为失败状态，停止测试用例执行
                        Assert.fail("执行出现异常，测试用例执行失败！");

                        /*
                         * 当前测试用例出现执行失败的步骤，则整个测试用例设定为失败状态，
                         *  break语句跳出当前的 for 循环，继续执行测试集合中的下一个测试
                         * 用例
                         */
                        break;
                    }
                }
                if (testResult == true) {
                    /*
                     * 如果测试用例的所有步骤执行成功，则会在测试用例集合sheet中的当前执行测试用例
                     * 的执行结果设定为“测试执行成功”
                     */
                    ExcelUtil.setCellData(Constants.Sheet_TestSuite, testCaseNo,
                            Constants.Col_TestSuiteTestResult, "测试执行成功");
                }

            }
        }
    }

    private static void execute_Actions() {
        try {

            for (int i = 0; i < method.length; i++) {
                /*
                 * 使用反射的方式，找到关键字对应的测试方法，并使用 value （操作值） 作为测
                 * 试方法的函数值进行调用
                 */
                if (method[i].getName().equals(keyword)) {
                    method[i].invoke(keyWordsaction, locatorExpression, value);
                    if (testResult == true) {
                        /* 当前测试步骤执行成功，在 “test”sheet 中，会将当前执行的测
                         *  试步骤结果设定为“测试步骤执行成功”
                         */
                        ExcelUtil.setCellData(Constants.Sheet_TestSteps,
                                testStep, Constants.Col_TestStepTestResult, "测试步骤执行成功");
                        break;
                    } else {
                        /* 当前测试步骤执行失败，在 “test”sheet 中，会将当前执行的测
                         *  试步骤结果设定为“测试步骤执行失败”
                         */
                        ExcelUtil.setCellData(Constants.Sheet_TestSteps,
                                testStep, Constants.Col_TestStepTestResult, "测试步骤执行失败");

                        break;
                    }

                }
            }
        } catch (Exception e) {

        }
    }

    @BeforeClass
    @Parameters({"udid", "port"})
    public void BeforeClass(String udid, String port) throws Exception {
        ProUtil p = new ProUtil(ChPath.globalPath);
        String server = p.getPro("server");
        String capsPath = ChPath.capsPath;
        String input = "com.example.android.softkeyboard/.SoftKeyboard";
//		keyWordsaction.driver=new AndroidDriverBase(server, port, capsPath, udid, input);
//		keyWordsaction.driver.implicitlyWait(10);

    }

    @AfterClass
    public void afterClass() {
        keyWordsaction.quit();
    }
}
